#include "HeightMap.h"

HeightMap::HeightMap(std::string name) {
	std::ifstream file(name.c_str(), ios::binary);
	if(!file){
		return;
	}

	numVertices		= RAW_WIDTH*RAW_HEIGHT;
	numIndices		= (RAW_WIDTH-1)*(RAW_HEIGHT-1)*6;
	vertices		= new Vector3[numVertices];
	textureCoords	= new Vector2[numVertices];
	indices			= new GLuint[numIndices];


	unsigned char*data = new unsigned char[numVertices];
	file.read((char*)data, numVertices*sizeof(unsigned char));
	file.close();

	for(int x = 0; x < RAW_WIDTH; ++x){
		for(int z = 0; z < RAW_HEIGHT; ++z){
			int offset = (x * RAW_WIDTH) + z;

			vertices[offset]	= Vector3(x * HEIGHTMAP_X, data[offset] * HEIGHTMAP_Y, z * HEIGHTMAP_Z);

			textureCoords[offset]	= Vector2(x * HEIGHTMAP_TEX_X, z * HEIGHTMAP_TEX_Z);
		}
	}

	delete data;

	numIndices = 0;

	for(int x = 0; x < RAW_WIDTH-1; ++x){
		for(int z = 0; z < RAW_HEIGHT-1; ++z){
			int a = (x		* (RAW_WIDTH)) + z;
			int b = ((x+1)  * (RAW_WIDTH)) + z;
			int c = ((x+1)  * (RAW_WIDTH)) + (z+1);
			int d = (x		* (RAW_WIDTH)) + (z+1);

			indices[numIndices++] = c;
			indices[numIndices++] = b;
			indices[numIndices++] = a;

			indices[numIndices++] = a;
			indices[numIndices++] = d;
			indices[numIndices++] = c;
		}
	}

	GenerateNormals();
	GenerateTangents();
	BufferData();
}